﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Aga.Psad.Backend.Entities;
using System.Web.Security;

namespace Aga.Psad.Backend.Repositories
{
    public class DespachoRepository : RepositoryBase<Despacho>
    {
        /// <summary>
        /// Searches the specified username.
        /// </summary>
        /// <param name="username">The username.</param>
        /// <param name="legajo">The legajo.</param>
        /// <param name="declarante">The declarante.</param>
        /// <param name="importador">The importador.</param>
        /// <param name="index">The index.</param>
        /// <param name="pageSize">Size of the page.</param>
        /// <returns></returns>
        public List<Despacho> Search(string username, string legajo, string declarante, string importador, int index, int pageSize)
        {
            List<Despacho> depachosDelUsuario;

            var usersService = new MvcMembership.AspNetMembershipProviderWrapper(Membership.Provider);
            var rolesService = new MvcMembership.AspNetRoleProviderWrapper(Roles.Provider);

            if (rolesService.IsInRole(usersService.Get(username), "Visualizador"))
            {
                depachosDelUsuario = GetAll();
            }
            else
            {
                depachosDelUsuario = GetByUser(username);
            }

            legajo = legajo.ToUpper();
            declarante = declarante.ToUpper();
            importador = importador.ToUpper();

            if (depachosDelUsuario.Count > 0)
            {
                // ToDo: Check the predicate!

                // Aplico los filtros
                return depachosDelUsuario
                        .Where(d => 
                            (String.IsNullOrEmpty(legajo) || d.Legajo.ToUpper().Contains(legajo)) &&
                            (String.IsNullOrEmpty(declarante) || d.Declarante.RazonSocial.ToUpper().Contains(declarante) || d.Declarante.Cuit.ToUpper().Contains(declarante)) &&
                            (String.IsNullOrEmpty(importador) || d.ImportadorExportador.RazonSocial.ToUpper().Contains(importador) || d.ImportadorExportador.Cuit.ToUpper().Contains(importador)))
                        .ToList();
            }

            return depachosDelUsuario;
        }

        private List<Despacho> GetByUser(string username)
        {
            List<Despacho> depachosDelUsuario = new List<Despacho>();

            // Si el usuario es un declarante, obtengo sus despachos
            ClienteRepository declarantes = new ClienteRepository();
            List<Cliente> declarante = declarantes.GetByUserName(username);

            if (declarante.Count > 0)
            {
                foreach (var d in declarante)
                    depachosDelUsuario.AddRange(d.Despachos);
            }
            else
            {
                // Si el usuario es un importador, obtengo sus despachos
                ClienteDeClienteRepository importadores = new ClienteDeClienteRepository();
                List<ClienteDeCliente> importador = importadores.GetByUserName(username);

                if (importador.Count > 0)
                    foreach (var i in importador)
                        depachosDelUsuario.AddRange(i.Despachos);
            }


            return depachosDelUsuario;
        }

        /// <summary>
        /// Gets the by legajo.
        /// </summary>
        /// <param name="legajo">The legajo.</param>
        /// <returns></returns>
        public Despacho GetByLegajo(string legajo)
        {
            return DC.Despachos.Where(d => d.Legajo.Equals(legajo)).SingleOrDefault();
        }
    }
}
